﻿#pragma once

#include <boost/signal.hpp>

#include "../../domain/models/CardSet.h"
#include "../../domain/models/CardsCollection.h"
#include "../../domain/models/Player.h"

namespace Views {
	class IDeductionView
	{
	public:
		virtual ~IDeductionView() {};

		/**
		* Typ zdarzenia wyboru karty
		* @param player_card Wybrana karta gracza
		* @param weapon_card Wybrana karta broni
		*/
		typedef boost::signal<void (Cards::PlayerCard*, Cards::WeaponCard*)> OnSearchedCardsPick;
		/**
		* Typ zdarzenia skończenia wyświetlania informacji o wydedukowanych kartach
		*/
		typedef boost::signal<void ()> OnDeductedCardsShow;
		/**
		* Typ zdarzenia wyboru jednej z kart w podejrzeniu
		* @param card Wybrana karta
		*/
		typedef boost::signal<void (Cards::Card*)> OnDeductedCardPick;

		OnSearchedCardsPick searchedCardsPickEvent; /**< Zdarzenie wyboru dedukowanych kart */
		OnDeductedCardPick deductedCardPickEvent; /**< Zdarzenie wyboru jednej z kart w podejrzeniu */
		OnDeductedCardsShow deductedCardsShowEvent; /**< Zdarzenie skończenia informacji o wydedukowanych kartach */

		/**
		* Rozpoczyna wybór karty gracza i karty broni, które znajdą się w przedstawianym przez gracza podejrzeniu
		* @param player Gracz wystawiający podejrzenie
		* @param players_cards Wszystkie karty postaci
		* @param weapons_cards Wszystkie karty broni
		*/
		virtual void openPickSearchedCardsDialog(Players::Player*, Cards::PlayersCards, Cards::WeaponsCards) = 0;
		/**
		* Rozpoczyna wybór jednej z kart w podejrzeniu. Funkcja wywoływana w przypadku,
		* gdy gracz posiada więcej niż jedną kartę spośród tych w wysuniętym podejrzeniu.
		* @param player Gracz odpytywany o posiadanie kart
		* @param cards Wspólne karty gracza i tych w podejrzeniu
		*/
		virtual void openPickCardDialog(Players::Player*, Cards::CardSet&) = 0;
		/**
		* Podaje informację o wydedukowanej karcie
		* @param card Wydedukowana karta
		* @param current_player Gracz wysuwający podejrzenie
		* @param card_owner Gracz posiadający kartę
		*/
		virtual void showDeductedCard(Cards::Card* card, Players::Player* current_player, Players::Player* card_owner) = 0;
		/**
		* Podaje informacje o tym, że żaden z graczy nie miał żadnej z kart podanych w wyprowadzeniu.
		* @param cards Karty w podejrzeniu
		* @param current_player Gracz wysuwający podejrzenie
		*/
		virtual void showNoCardsDeducted(Cards::CardSet& cards, Players::Player* current_player) = 0;
	};
}

